﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dziennik_ProfilNauczyciela {
    class ZestawienieOcenXml {
        int idKlasy;
        int semestr;
        string nazwaKlasy;
        public XDocument zestawienie;

        public ZestawienieOcenXml(int idKlasy) {
            this.idKlasy = idKlasy;
            var nazwa = (from k in SQLInterface.linqDataContext.klasies
                        where k.id == idKlasy
                         select new { k.semestr, k.nazwa }).ToArray();
            semestr = nazwa[0].semestr;
            nazwaKlasy = ((nazwa[0].semestr + 1) / 2).ToString() + nazwa[0].nazwa;

            zestawienie = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
            zestawienie.Add(new XElement("zestawienie", new XAttribute("klasa",nazwaKlasy)));
            
            var uczniowie = from u in SQLInterface.linqDataContext.uczniowies
                            where u.idKlasy == idKlasy
                            select new {u.userId, u.imie, u.nazwisko};

            foreach (var u in uczniowie) {
                XElement uczen = new XElement("uczen",
                    new XAttribute("userId", u.userId),
                    new XAttribute("imie", u.imie),
                    new XAttribute("nazwisko", u.nazwisko));

                List<XElement> listaPrzedmiotow = new List<XElement>();

                var przedmioty = from p in SQLInterface.linqDataContext.przedmioties
                                 join n in SQLInterface.linqDataContext.nauczycieles
                                 on p.userIdNauczyciela equals n.userId
                                 where p.idKlasy == idKlasy
                                 select new {p.id, p.nazwa, n.tytulNaukowy, n.imie, n.nazwisko};

                foreach (var p in przedmioty) {
                    var oceny = from o in SQLInterface.linqDataContext.ocenies
                                where o.idPrzedmiotu == p.id && o.userIdUcznia == u.userId
                                select new {o.ocena, o.waga, o.zaCo};

                    List<XElement> listaOcen = new List<XElement>();
                    foreach (var o in oceny) {
                        XElement ocena =
                            new XElement("ocena",
                            new XAttribute("waga", o.waga),
                            new XAttribute("zaCo", o.zaCo),
                            o.ocena);
                        listaOcen.Add(ocena);
                    }
                    //mamy listę ocen z danego przedmiotu
                    XElement przedmiot =
                        new XElement("przedmiot",
                        new XAttribute("nazwa", p.nazwa),
                        new XAttribute("nauczyciel", p.tytulNaukowy + " " + p.imie + " " + p.nazwisko));
                    foreach (XElement o in listaOcen) {
                        przedmiot.Add(o);
                    }
                    listaPrzedmiotow.Add(przedmiot);                           
                }
                foreach (XElement p in listaPrzedmiotow) {
                    uczen.Add(p);
                }
                zestawienie.Root.Add(uczen);
            }            
        }
        public void SortujAZ() {
            List<XElement> posortowaniUczniowie = zestawienie.Root.Elements().OrderBy(u => u.Attribute("nazwisko")).ThenBy(u => u.Attribute("imie")).ToList();
            zestawienie.Root.Elements().Remove();
            zestawienie.Root.Add(posortowaniUczniowie);
        }
        public void SortujZA() {
            List<XElement> posortowaniUczniowie = zestawienie.Root.Elements()
                .OrderByDescending(u => u.Attribute("nazwisko").ToString())
                .ThenByDescending(u => u.Attribute("imie").ToString()).ToList();
            zestawienie.Root.Elements().Remove();
            zestawienie.Root.Add(posortowaniUczniowie);
        }
        public List<int> UserIdZagrozonych() {
            List<XElement> uczniowie = zestawienie.Root.Elements().ToList();
            List<int> zagrozeni = new List<int>();
            foreach (XElement u in uczniowie) {
                foreach (XElement p in u.Elements()) {
                    double sumaOcen = 0;
                    double sumaWag = 0;
                    double srednia;
                    foreach (XElement o in p.Elements()) {
                        sumaOcen += Convert.ToDouble(o.Value);
                        sumaWag += Convert.ToInt32(o.Attribute("waga"));
                    }
                    srednia = sumaOcen / sumaWag;
                    if (srednia <= 1.7) {
                        zagrozeni.Add(Convert.ToInt32(u.Attribute("userId")));
                        break;
                    }
                }
            }
            return zagrozeni;
        }
    }
}
